package cn.kgc.spring.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author 课工场
 * @date 2024/4/29
 * @description   jdk的动态代理
 */
public class JDKProxy {

    // 被代理对象
    private Object obj;

    public JDKProxy(Object obj){
        this.obj = obj;
    }

    //  获取代理对象
    public  Object   getProxy(){

        /*
        * 通过调用Proxy中的newProxyInstance 创建代理实例
        *
        *  ClassLoader loader,      类加载器   加载类模板到虚拟机创建对象    jvm虚拟机不会为动态生成代理类分配类加载器
           Class<?>[] interfaces,   基于接口的代理  被代理对象实现的所有接口    反射
           InvocationHandler h      业务功能增强代码封装的对象
        * */

        // 1.  类加载器
        ClassLoader classLoader = this.getClass().getClassLoader();
        // 2.获取被代理对象实现的所有接口
        Class<?>[] interfaces = obj.getClass().getInterfaces();
        /**
         * 3. 封装需要增强的业务
         *    proxy     代理对象
         *    method    方法对象     代理对象调用的方法    通过代理对象调用方法  默认会调用invocationHandler   invoke
         *    args      方法参数     代理对象调用的方法参数
         *
         */
        InvocationHandler invocationHandler = (proxy,method, args)->{

            // 调用方法 调用被代理对象的方法
            try {
                System.out.println("上课时间到了，请开始上课");
                Object invoke = method.invoke(obj, args);
                System.out.println("下课时间到了，请准时下课");
                return invoke;
            }catch (Exception e){
                // 连接点
            }finally {
                // 连接点
            }
            return null;
        };


        // 代理对象的创建
        Object o = Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);


        return o;
    }

}
